#!/usr/bin/env python
# coding: utf-8

""" 动态分配key并且验证key

使用redis数据库

1.验证请求来源key的正确性
 为保证安全，同时验证请求来源的session_id
 key正确返回True
 key不正确返回False

2.动态分配key
 Oauth授权成功后登录页面，使用session_id+随机字符串作为动态key
 base64加密后返回

"""

import base64
import random
from dbhandle import redisdb
from config  import settings

""" 初始化redisdb类 """
r = redisdb.redisdb( 0 )

#s = "c622d54851da13703d6da828ea399978cc5361d3"

def generatekey( session_id ):
    """根据传入的session_id+生成的随机字符串生成并返回key """
    srcKey = session_id + getstr( settings.LENSTR )
    key = base64.encodestring( srcKey ) # 进行url的字符串编码
    """ 存入redis数据库以备后续验证使用，以session_id为检索条件 """
    r.set( session_id, srcKey )
    
    """ 设置key失效时间 """
    r.expire( session_id, settings.EXPIRETIME ) 
    return key


def checkkey( session, ctx_env ):
    """ 验证传入的key是否有效 """
    """ 根据session_id从redis数据库获取该key """
    verify = False
    csrckey = ctx_env.get( 'HTTP_XSRCKEY', None )
    if session is not None and csrckey is not None:
        srckey = r.get( session.session_id )
        if srckey is not None and srckey == csrckey:
            verify = True
    return verify 


def getstr( n ):
    """ 生成指定长度的字符串  全小写""" 
    st = '' 
    while len( st ) < n: 
        temp = chr( 97 + random.randint( 0, 25 ) )
        if st.find( temp ) == -1 :
            st = st.join( ['', temp] )
    return st

